More fixes: One of my fixes to type_traits earlier today was incorrect, so that is reverted. Recently clang appears to have tightened up its definition of is_convertible and that has caused some failures in [unordered_][multi]map. I've switched to using is_constructible to restablish the desired functionality in [unordered_][multi]map. Specifically, inserting rvalues of move-only types for the keys. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@133402 91177308-0d34-0410-b5e6-96231b3b80d8 
diff --git a/include/map b/include/map index d675bc5..cf9cbcf 100644 --- a/include/map +++ b/include/map 
@@ -869,7 +869,7 @@  emplace() {return __tree_.__emplace_unique();}    template <class _A0, - class = typename enable_if<is_convertible<_A0, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _A0>::value>::type>  _LIBCPP_INLINE_VISIBILITY  pair<iterator, bool>  emplace(_A0&& __a0) @@ -878,7 +878,7 @@  #ifndef _LIBCPP_HAS_NO_VARIADICS    template <class _A0, class ..._Args, - class = typename enable_if<is_convertible<_A0, key_type>::value>::type> + class = typename enable_if<is_constructible<key_type, _A0>::value>::type>  pair<iterator, bool>  emplace(_A0&& __a0, _Args&& ...__args);   @@ -890,7 +890,7 @@  {return __tree_.__emplace_hint_unique(__p.__i_);}    template <class _A0, - class = typename enable_if<is_convertible<_A0, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _A0>::value>::type>  _LIBCPP_INLINE_VISIBILITY  iterator  emplace_hint(const_iterator __p, _A0&& __a0) @@ -899,20 +899,20 @@  #ifndef _LIBCPP_HAS_NO_VARIADICS    template <class _A0, class ..._Args, - class = typename enable_if<is_convertible<_A0, key_type>::value>::type> + class = typename enable_if<is_constructible<key_type, _A0>::value>::type>  iterator  emplace_hint(const_iterator __p, _A0&& __a0, _Args&& ...__args);    #endif // _LIBCPP_HAS_NO_VARIADICS    template <class _P, - class = typename enable_if<is_convertible<_P, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _P>::value>::type>  _LIBCPP_INLINE_VISIBILITY  pair<iterator, bool> insert(_P&& __p)  {return __tree_.__insert_unique(_STD::forward<_P>(__p));}    template <class _P, - class = typename enable_if<is_convertible<_P, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _P>::value>::type>  _LIBCPP_INLINE_VISIBILITY  iterator insert(const_iterator __pos, _P&& __p)  {return __tree_.__insert_unique(__pos.__i_, _STD::forward<_P>(__p));} @@ -995,11 +995,11 @@  #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES  __node_holder __construct_node();  template <class _A0, - class = typename enable_if<is_convertible<_A0, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _A0>::value>::type>  __node_holder __construct_node(_A0&& __a0);  #ifndef _LIBCPP_HAS_NO_VARIADICS  template <class _A0, class ..._Args, - class = typename enable_if<is_convertible<_A0, key_type>::value>::type> + class = typename enable_if<is_constructible<key_type, _A0>::value>::type>  __node_holder __construct_node(_A0&& __a0, _Args&& ...__args);  #endif // _LIBCPP_HAS_NO_VARIADICS  #else // _LIBCPP_HAS_NO_RVALUE_REFERENCES @@ -1309,7 +1309,7 @@    template <class _Key, class _Tp, class _Compare, class _Allocator>  template <class _A0, class ..._Args, - class //= typename enable_if<is_convertible<_A0, _Key>::value>::type + class //= typename enable_if<is_constructible<_Key, _A0>::value>::type  >  pair<typename map<_Key, _Tp, _Compare, _Allocator>::iterator, bool>  map<_Key, _Tp, _Compare, _Allocator>::emplace(_A0&& __a0, _Args&& ...__args) @@ -1324,7 +1324,7 @@    template <class _Key, class _Tp, class _Compare, class _Allocator>  template <class _A0, class ..._Args, - class //= typename enable_if<is_convertible<_A0, _Key>::value>::type + class //= typename enable_if<is_constructible<_Key, _A0>::value>::type  >  typename map<_Key, _Tp, _Compare, _Allocator>::iterator  map<_Key, _Tp, _Compare, _Allocator>::emplace_hint(const_iterator __p, @@ -1601,7 +1601,7 @@  iterator emplace() {return __tree_.__emplace_multi();}    template <class _A0, - class = typename enable_if<is_convertible<_A0, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _A0>::value>::type>  _LIBCPP_INLINE_VISIBILITY  iterator  emplace(_A0&& __a0) @@ -1610,7 +1610,7 @@  #ifndef _LIBCPP_HAS_NO_VARIADICS    template <class _A0, class ..._Args, - class = typename enable_if<is_convertible<_A0, key_type>::value>::type> + class = typename enable_if<is_constructible<key_type, _A0>::value>::type>  iterator  emplace(_A0&& __a0, _Args&& ...__args);   @@ -1621,7 +1621,7 @@  {return __tree_.__emplace_hint_multi(__p.__i_);}    template <class _A0, - class = typename enable_if<is_convertible<_A0, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _A0>::value>::type>  _LIBCPP_INLINE_VISIBILITY  iterator  emplace_hint(const_iterator __p, _A0&& __a0) @@ -1630,20 +1630,20 @@  #ifndef _LIBCPP_HAS_NO_VARIADICS    template <class _A0, class ..._Args, - class = typename enable_if<is_convertible<_A0, key_type>::value>::type> + class = typename enable_if<is_constructible<key_type, _A0>::value>::type>  iterator  emplace_hint(const_iterator __p, _A0&& __a0, _Args&& ...__args);    #endif // _LIBCPP_HAS_NO_VARIADICS    template <class _P, - class = typename enable_if<is_convertible<_P, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _P>::value>::type>  _LIBCPP_INLINE_VISIBILITY  iterator insert(_P&& __p)  {return __tree_.__insert_multi(_STD::forward<_P>(__p));}    template <class _P, - class = typename enable_if<is_convertible<_P, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _P>::value>::type>  _LIBCPP_INLINE_VISIBILITY  iterator insert(const_iterator __pos, _P&& __p)  {return __tree_.__insert_multi(__pos.__i_, _STD::forward<_P>(__p));} @@ -1721,11 +1721,11 @@  #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES  __node_holder __construct_node();  template <class _A0, - class = typename enable_if<is_convertible<_A0, value_type>::value>::type> + class = typename enable_if<is_constructible<value_type, _A0>::value>::type>  __node_holder __construct_node(_A0&& __a0);  #ifndef _LIBCPP_HAS_NO_VARIADICS  template <class _A0, class ..._Args, - class = typename enable_if<is_convertible<_A0, key_type>::value>::type> + class = typename enable_if<is_constructible<key_type, _A0>::value>::type>  __node_holder __construct_node(_A0&& __a0, _Args&& ...__args);  #endif // _LIBCPP_HAS_NO_VARIADICS  #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES @@ -1761,7 +1761,7 @@    template <class _Key, class _Tp, class _Compare, class _Allocator>  template <class _A0, - class // = typename enable_if<is_convertible<_A0, value_type>::value>::type + class // = typename enable_if<is_constructible<value_type, _A0>::value>::type  >  typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder  multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0) @@ -1778,7 +1778,7 @@    template <class _Key, class _Tp, class _Compare, class _Allocator>  template <class _A0, class ..._Args, - class // = typename enable_if<is_convertible<_A0, key_type>::value>::type + class // = typename enable_if<is_constructible<key_type, _A0>::value>::type  >  typename multimap<_Key, _Tp, _Compare, _Allocator>::__node_holder  multimap<_Key, _Tp, _Compare, _Allocator>::__construct_node(_A0&& __a0, _Args&& ...__args) @@ -1799,7 +1799,7 @@    template <class _Key, class _Tp, class _Compare, class _Allocator>  template <class _A0, class ..._Args, - class //= typename enable_if<is_convertible<_A0, _Key>::value>::type + class //= typename enable_if<is_constructible<_Key, _A0>::value>::type  >  typename multimap<_Key, _Tp, _Compare, _Allocator>::iterator  multimap<_Key, _Tp, _Compare, _Allocator>::emplace(_A0&& __a0, _Args&& ...__args) @@ -1813,7 +1813,7 @@    template <class _Key, class _Tp, class _Compare, class _Allocator>  template <class _A0, class ..._Args, - class //= typename enable_if<is_convertible<_A0, _Key>::value>::type + class //= typename enable_if<is_constructible<_Key, _A0>::value>::type  >  typename multimap<_Key, _Tp, _Compare, _Allocator>::iterator  multimap<_Key, _Tp, _Compare, _Allocator>::emplace_hint(const_iterator __p,